package dao;

import banco.ConnectionDB;
import model.Funcionario;
import java.awt.Frame;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class FuncionarioDAOImp implements GenericDAOImp<Funcionario> {

    private Frame frame;
    private Connection connection;

    public FuncionarioDAOImp(Frame frame) {
        this.frame = frame;

        connection = new ConnectionDB().getConnection();
    }

    @Override
    public void adiciona(Funcionario funcionario) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "INSERT INTO funcionario (funcionario_ID, nomefuncionario, admissao, salario, funcao, "
                    + "foto_funcionario) "
                    + "VALUES (?, ?, ?, ?, ?, ?)");

            statement.setInt(1, funcionario.getFuncionarioID());
            statement.setString(2, funcionario.getNomefuncionario());
            statement.setString(3, funcionario.getAdmissao());
            statement.setDouble(4, funcionario.getSalario());
            statement.setString(5, funcionario.getFuncao());
            statement.setString(6, funcionario.getCaminhoFoto());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void altera(Funcionario funcionario) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "UPDATE funcionario SET nomefuncionario = ?, "
                    + "admissao = ?, salario = ?, "
                    + "funcao = ?, "
                    + "foto_funcionario = ? "
                    + "WHERE funcionario_ID = ?");

            statement.setString(1, funcionario.getNomefuncionario());
            statement.setString(2, funcionario.getAdmissao());
            statement.setDouble(3, funcionario.getSalario());
            statement.setString(4, funcionario.getFuncao());
            statement.setString(5, funcionario.getCaminhoFoto());
            statement.setInt(6, funcionario.getFuncionarioID());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            System.out.println("Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void remove(Object iD) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "DELETE FROM funcionario "
                    + "WHERE funcionario_ID = ?");

            statement.setObject(1, iD);

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Funcionario listaPorID(Object iD) {
        try {
            Funcionario funcionario = null;
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nomefuncionario, admissao, salario, funcao, "
                    + "foto_funcionario "
                    + "FROM funcionario "
                    + "WHERE funcionario_ID = ?");

            statement.setObject(1, iD);

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                funcionario = new Funcionario();
                funcionario.setFuncionarioID((Integer) iD);
                funcionario.setNomefuncionario(resultSet.getString(1));
                funcionario.setAdmissao(resultSet.getString(2));
                funcionario.setSalario(resultSet.getDouble(3));
                funcionario.setFuncao(resultSet.getString(4));
                funcionario.setCaminhoFoto(resultSet.getString(5));
            }

            resultSet.close();
            statement.close();

            return funcionario;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Funcionario consultaSeta(String iD, int seta) {
        try {
            Funcionario funcionario = null;
            String query = "SELECT funcionario_ID, nomefuncionario, admissao, salario, funcao, "
                    + "foto_funcionario "
                    + "FROM funcionario ";
            PreparedStatement statement = null;

            switch (seta) {
                case 1:
                    statement = connection.prepareStatement(
                            query + "ORDER BY funcionario_ID;");

                    break;
                case 2:
                    statement = connection.prepareStatement(
                            query + "WHERE funcionario_ID < ? "
                            + "ORDER BY funcionario_ID DESC;");

                    statement.setString(1, iD);

                    break;
                case 3:
                    statement = connection.prepareStatement(
                            query + "WHERE funcionario_ID > ? "
                            + "ORDER BY funcionario_ID;");

                    statement.setString(1, iD);

                    break;
                case 4:
                    statement = connection.prepareStatement(
                            query + "ORDER BY funcionario_ID DESC;");

                    break;
            }

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                funcionario = new Funcionario();

                funcionario.setFuncionarioID(resultSet.getInt(1));
                funcionario.setNomefuncionario(resultSet.getString(2));
                funcionario.setAdmissao(resultSet.getString(3));
                funcionario.setSalario(resultSet.getDouble(4));
                funcionario.setFuncao(resultSet.getString(5));
                funcionario.setCaminhoFoto(resultSet.getString(6));
            }

            resultSet.close();
            statement.close();

            return funcionario;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame,
                    "Erro ao executar comando no banco de dados!\n"
                    + "O programa vai ser fechado.\n\nErro ocorrido:\n"
                    + sQLException.getMessage());

            System.exit(0);

            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public List<Funcionario> listaTudo() {
        try {
            List<Funcionario> funcionarios = new ArrayList<Funcionario>();

            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nomefuncionario, admissao, salario, funcao, "
                    + "foto_funcionario "
                    + "FROM funcionario "
                    + "ORDER BY funcionario_ID");

            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {

                Funcionario funcionario = new Funcionario();

                funcionario.setNomefuncionario(resultSet.getString(1));
                funcionario.setAdmissao(resultSet.getString(2));
                funcionario.setSalario(resultSet.getDouble(3));
                funcionario.setFuncao(resultSet.getString(4));

                funcionarios.add(funcionario);
            }

            resultSet.close();
            statement.close();

            return funcionarios;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public int consultaProximoID() {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT * "
                    + "FROM funcionario "
                    + "ORDER BY funcionario_ID DESC");

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {
                return resultSet.getInt(1) + 1;
            }

            resultSet.close();
            statement.close();

            return 1;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }
}
